<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
<script>
  // 兔子序列 1,1,2,3,5,8,13,21;
  // 三位数，每位数上的三次幂之和等于他本身，我们称为 水仙花数
  // 153 就是水仙花数
  //  2*2*2 = 2**3 2的三次幂
  // let num = 2**3;
//   let arr = [];
// //   let str = '153';
// //   console.log(str.split(''));
//   for(let i = 100;i<1000;i++){
//     let nums = i.toString().split('');
//     let num = 0;
//     nums.forEach(item => {
//       num += item**3;
//     })
//     // console.log(num);
//     if (i == num){
//         arr.push(i)
//     }
//   }
//   console.log(arr);

// function fn(a, b, c, d, e) {
//   console.log(a, b, c, d, e)
// }
// fn(1,2,3,4,5)
// let _fn = curry(fn);
// console.log(_fn);
// _fn(1,2,3,4,5);
// _fn((1,2),(3,4,5))
// console.log();

// function add () {
//     let x=0;
//     for(let i=0;i<arguments.length;i++){
//     x+=arguments[i];
//     }
//     return x;
// }

function add(a,b,c,d,e,f){
   return a+b+c+d+e+f;
}
// console.log(add((1,2,3),(4,5,6)));
// // console.log(add(1,2,3,4,5,6));


let _add = curry(add);
// // console.log(_add);
// // console.log(_add(9,10));

console.log(_add(1,3)(2,4)(5,6));

// function checkByRegExp(regExp, string) {  // regExp 传入的正则 // string 传入的要校验的值
//   return regExp.test(string)
// }

// 手机号有5个 使用下面的方法的时候，要调用五次
// checkByRegExp(/^1\d{10}$/, '18642838451')
// checkByRegExp(/^1\d{10}$/, '18642838452')
// checkByRegExp(/^1\d{10}$/, '18642838453')
// checkByRegExp(/^1\d{10}$/, '18642838454')
// checkByRegExp(/^1\d{10}$/, '18642838455')

// let checkPhone = curry(checkByRegExp,/^1\d{10}$/);

// console.log(checkPhone('18642838450'));
// checkPhone('18642838450')
// checkPhone('18642838451')
// checkPhone('18642838452')
// checkPhone('18642838453')


// checkByRegExp(/^1\d{10}$/, '18642838455') // 校验电话号码
// checkByRegExp(/^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/, 'test@163.com') // 校验邮箱


// 柯理化函数
// 复杂版(每次可传入不定数量的参数，当所传参数总数不少于函数的形参总数时，才会执行)
function curry(fn) {
//   console.log(fn.length); // fn 就是你传入的函数
  // 闭包
  // 缓存除函数fn之外的所有参数
//   console.log(arguments);
  let args = Array.prototype.slice.call(arguments, 1);
//   console.log(args);
  return function() {
    // 连接已缓存的老的参数和新传入的参数(即把每次传入的参数全部先保存下来，但是并不执行)
    let newArgs = args.concat(Array.from(arguments))
    // console.log(newArgs);
    // console.log(newArgs);
    // console.log(arguments);
    // console.log(fn.length);
    if (newArgs.length < fn.length) {
      // 累积的参数总数少于fn形参总数
      // 递归传入fn和已累积的参数
      return curry.call(this, fn, ...newArgs)
    } 
    // console.log(this);
    // 调用
    return fn.apply(this, newArgs)
  }
}
</script>